home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / gdb-4.5 / dist / libiberty / strtoul.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-22  |  1.6 KB  |  93 lines

  1. /*
  2.  * strtol : convert a string to long.
  3.  *
  4.  * Andy Wilson, 2-Oct-89.
  5.  */
  6.  
  7. #include <errno.h>
  8. #include <ctype.h>
  9. #include <stdio.h>
  10. #include "ansidecl.h"
  11.  
  12. #ifndef ULONG_MAX
  13. #define    ULONG_MAX    ((unsigned long)(~0L))        /* 0xFFFFFFFF */
  14. #endif
  15.  
  16. extern int errno;
  17.  
  18. unsigned long
  19. strtoul(s, ptr, base)
  20.      CONST char *s; char **ptr; int base;
  21. {
  22.   unsigned long total = 0, tmp = 0;
  23.   unsigned digit;
  24.   int radix;
  25.   CONST char *start=s;
  26.   int did_conversion=0;
  27.  
  28.   if (s==NULL)
  29.     {
  30.       errno = ERANGE;
  31.       if (!ptr)
  32.     *ptr = (char *)start;
  33.       return 0L;
  34.     }
  35.  
  36.   while (isspace(*s))
  37.     s++;
  38.   if (*s == '+')
  39.     s++;
  40.   radix = base;
  41.   if (base==0 || base==16)
  42.     {
  43.       /*
  44.        * try to infer radix from the string
  45.        * (assume decimal).
  46.        */
  47.       if (*s=='0')
  48.     {
  49.       radix = 8;    /* guess it's octal */
  50.       s++;        /* (but check for hex) */
  51.       if (*s=='X' || *s=='x')
  52.         {
  53.           s++;
  54.           radix = 16;
  55.         }
  56.     }
  57.     }
  58.   if (radix==0)
  59.     radix = 10;
  60.  
  61.   while ( digit = *s )
  62.     {
  63.       if (digit >= '0' && digit < ('0'+radix))
  64.     digit -= '0';
  65.       else
  66.     if (radix > 10)
  67.       {
  68.         if (digit >= 'a' && digit < ('a'+radix))
  69.           digit = digit - 'a' + 10;
  70.         else if (digit >= 'A' && digit < ('A'+radix))
  71.           digit = digit - 'A' + 10;
  72.         else
  73.           break;
  74.       }
  75.     else
  76.       break;
  77.       did_conversion = 1;
  78.       tmp = (total * radix) + digit;
  79.       if (tmp < total)    /* check overflow */
  80.     {
  81.       errno = ERANGE;
  82.       if (ptr != NULL)
  83.         *ptr = (char *)s;
  84.       return (ULONG_MAX);
  85.     }
  86.       total = tmp;
  87.       s++;
  88.     }
  89.   if (ptr != NULL)
  90.     *ptr = (char *) ((did_conversion) ? (char *)s : (char *)start);
  91.   return (total);
  92. }
  93.